home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / arm / mach-ixp4xx / include / mach / qmgr.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.6 KB  |  127 lines

  1. /*
  2.  * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl>
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify it
  5.  * under the terms of version 2 of the GNU General Public License
  6.  * as published by the Free Software Foundation.
  7.  */
  8.  
  9. #ifndef IXP4XX_QMGR_H
  10. #define IXP4XX_QMGR_H
  11.  
  12. #include <linux/io.h>
  13. #include <linux/kernel.h>
  14.  
  15. #define HALF_QUEUES    32
  16. #define QUEUES        64    /* only 32 lower queues currently supported */
  17. #define MAX_QUEUE_LENGTH 4    /* in dwords */
  18.  
  19. #define QUEUE_STAT1_EMPTY        1 /* queue status bits */
  20. #define QUEUE_STAT1_NEARLY_EMPTY    2
  21. #define QUEUE_STAT1_NEARLY_FULL        4
  22. #define QUEUE_STAT1_FULL        8
  23. #define QUEUE_STAT2_UNDERFLOW        1
  24. #define QUEUE_STAT2_OVERFLOW        2
  25.  
  26. #define QUEUE_WATERMARK_0_ENTRIES    0
  27. #define QUEUE_WATERMARK_1_ENTRY        1
  28. #define QUEUE_WATERMARK_2_ENTRIES    2
  29. #define QUEUE_WATERMARK_4_ENTRIES    3
  30. #define QUEUE_WATERMARK_8_ENTRIES    4
  31. #define QUEUE_WATERMARK_16_ENTRIES    5
  32. #define QUEUE_WATERMARK_32_ENTRIES    6
  33. #define QUEUE_WATERMARK_64_ENTRIES    7
  34.  
  35. /* queue interrupt request conditions */
  36. #define QUEUE_IRQ_SRC_EMPTY        0
  37. #define QUEUE_IRQ_SRC_NEARLY_EMPTY    1
  38. #define QUEUE_IRQ_SRC_NEARLY_FULL    2
  39. #define QUEUE_IRQ_SRC_FULL        3
  40. #define QUEUE_IRQ_SRC_NOT_EMPTY        4
  41. #define QUEUE_IRQ_SRC_NOT_NEARLY_EMPTY    5
  42. #define QUEUE_IRQ_SRC_NOT_NEARLY_FULL    6
  43. #define QUEUE_IRQ_SRC_NOT_FULL        7
  44.  
  45. struct qmgr_regs {
  46.     u32 acc[QUEUES][MAX_QUEUE_LENGTH]; /* 0x000 - 0x3FF */
  47.     u32 stat1[4];        /* 0x400 - 0x40F */
  48.     u32 stat2[2];        /* 0x410 - 0x417 */
  49.     u32 statne_h;        /* 0x418 - queue nearly empty */
  50.     u32 statf_h;        /* 0x41C - queue full */
  51.     u32 irqsrc[4];        /* 0x420 - 0x42F IRC source */
  52.     u32 irqen[2];        /* 0x430 - 0x437 IRQ enabled */
  53.     u32 irqstat[2];        /* 0x438 - 0x43F - IRQ access only */
  54.     u32 reserved[1776];
  55.     u32 sram[2048];        /* 0x2000 - 0x3FFF - config and buffer */
  56. };
  57.  
  58. void qmgr_set_irq(unsigned int queue, int src,
  59.           void (*handler)(void *pdev), void *pdev);
  60. void qmgr_enable_irq(unsigned int queue);
  61. void qmgr_disable_irq(unsigned int queue);
  62.  
  63. /* request_ and release_queue() must be called from non-IRQ context */
  64. int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
  65.                unsigned int nearly_empty_watermark,
  66.                unsigned int nearly_full_watermark);
  67. void qmgr_release_queue(unsigned int queue);
  68.  
  69.  
  70. static inline void qmgr_put_entry(unsigned int queue, u32 val)
  71. {
  72.     extern struct qmgr_regs __iomem *qmgr_regs;
  73.     __raw_writel(val, &qmgr_regs->acc[queue][0]);
  74. }
  75.  
  76. static inline u32 qmgr_get_entry(unsigned int queue)
  77. {
  78.     extern struct qmgr_regs __iomem *qmgr_regs;
  79.     return __raw_readl(&qmgr_regs->acc[queue][0]);
  80. }
  81.  
  82. static inline int qmgr_get_stat1(unsigned int queue)
  83. {
  84.     extern struct qmgr_regs __iomem *qmgr_regs;
  85.     return (__raw_readl(&qmgr_regs->stat1[queue >> 3])
  86.         >> ((queue & 7) << 2)) & 0xF;
  87. }
  88.  
  89. static inline int qmgr_get_stat2(unsigned int queue)
  90. {
  91.     extern struct qmgr_regs __iomem *qmgr_regs;
  92.     return (__raw_readl(&qmgr_regs->stat2[queue >> 4])
  93.         >> ((queue & 0xF) << 1)) & 0x3;
  94. }
  95.  
  96. static inline int qmgr_stat_empty(unsigned int queue)
  97. {
  98.     return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_EMPTY);
  99. }
  100.  
  101. static inline int qmgr_stat_nearly_empty(unsigned int queue)
  102. {
  103.     return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_EMPTY);
  104. }
  105.  
  106. static inline int qmgr_stat_nearly_full(unsigned int queue)
  107. {
  108.     return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_FULL);
  109. }
  110.  
  111. static inline int qmgr_stat_full(unsigned int queue)
  112. {
  113.     return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_FULL);
  114. }
  115.  
  116. static inline int qmgr_stat_underflow(unsigned int queue)
  117. {
  118.     return !!(qmgr_get_stat2(queue) & QUEUE_STAT2_UNDERFLOW);
  119. }
  120.  
  121. static inline int qmgr_stat_overflow(unsigned int queue)
  122. {
  123.     return !!(qmgr_get_stat2(queue) & QUEUE_STAT2_OVERFLOW);
  124. }
  125.  
  126. #endif
  127.